1 Contenido de la clase
Regla de inferencia del if con else Pág. 101-107
Para demostrar la corrección de if B then C1 else C2 con precondición {P} y poscondición {Q} hay que demostrar dos cosas:
{ P ∧ B } C1 { Q }(cuando la condición es verdadera se ejecutaC1).{ P ∧ ¬B } C2 { Q }(cuando es falsa se ejecutaC2).
{P ∧ B} C1 {Q} ; {P ∧ ¬B} C2 {Q} ⇒ {P} if B then C1 else C2 {Q}
Ejemplo: máximo de dos números. Demostrar que es correcta la terna
{ } if a > b then m := a else m := b { (m ≥ a) ∧ (m ≥ b) }
Intuitivamente: si a > b → m := a > b → { m = a ∧ m > b }; si ¬(a > b) (es decir b ≥ a) → m := b ≥ a → { m = b ∧ m ≥ a }. En ambos casos m obtiene el mayor de a y b.
- Caso verdadero: se demuestra
{ a > b } m := a { (m ≥ a) ∧ (m ≥ b) }. Por la regla de la asignación, la precondición es{ (a ≥ a) ∧ (a ≥ b) }; como{ a > b } ⇒ { a ≥ a ∧ a ≥ b }, se concluye (q.l.q.d.). - Caso falso: se demuestra
{ ¬(a > b) } m := b { (m ≥ a) ∧ (m ≥ b) }. La precondición por asignación es{ (b ≥ a) ∧ (b ≥ b) }, y como{ ¬(a > b) } = { b ≥ a }, se concluye (q.l.q.d.). - Finalmente, aplicando la regla del
ifconelsea ambos casos, la terna es correcta (q.l.q.d.).
Segundo ejemplo: demostrar { a > b } if a > b then m := a else m := b { m = a }.
- Intuitivamente, como
a > b, se ejecutam := a, por lo quem = a. - Caso verdadero: se demuestra
{ a > b } m := a { m = a }(la precondición por asignación es{ a = a } = { }). - Caso falso: se demuestra
{ ¬(a > b) } m := b { m = a }. La precondición por asignación es{ b = a }, y como{ ¬(a > b) }(junto a¬(b > a)) implica{ b = a }, se concluye. - Aplicando la regla del
ifconelse, la terna es correcta.
Verificación de ciclos. Inducción matemática Pág. 108
Para demostrar la corrección de un ciclo se usa la inducción matemática:
- Sea
kun entero fijo (positivo, negativo o cero). Para cada enteron ≥ khay una proposiciónP(n)y se desea demostrar que es verdadera para todon ≥ k. - Paso básico o paso base:
P(k)es verdadera. - Paso inductivo: para
n ≥ k, siempre queP(n)sea verdadera (hipótesis de inducción), se sigue queP(n + 1)es verdadera. - Entonces el principio de inducción matemática establece que
P(n)es verdadera para todon ≥ k.
Ejemplo: la función Cuadrado(A) Pág. 109-112
Seudocódigo:
Function Cuadrado(A) ; C ← 0 ; D ← 0 ; While (D ≠ A) ; C ← C + A ; D ← D + 1 ; Return C
Se demuestra que esta función calcula el cuadrado de un entero positivo A. Sean C_n y D_n los valores de C y D tras pasar n veces por el ciclo:
C_0 = 0,C_1 = A,C_2 = 2A,C_3 = 3A, … → se conjetura queC_n = n·A.D_0 = 0,D_1 = 1,D_2 = 2, … →D_n = n.- Sea
P(n)el enunciadoC_n = n·A; se prueba por inducción conk = 0.
- Paso base (n = 0):
C_0 = 0·A = 0, que es cierto porqueC_0 = 0. - Hipótesis de inducción: supongamos
C_n = n·A. - Paso inductivo (n + 1): tras pasar una vez más por el ciclo, a
Cse le sumaAy aDse le suma 1:C_{n+1} = C_n + A = n·A + A = A(n + 1). AsíP(n + 1)es verdadera.
Por el principio de inducción, siempre que el ciclo ocurre se cumple C_n = n·A. Cuando el ciclo termina, D_n = A, y como D_n = n, entonces n = A y C = A·A = A². Por lo tanto la función regresa el cuadrado de A.
Invariante de un ciclo Pág. 113
Un invariante de un ciclo es una relación entre variables que persiste a través de todas las iteraciones del ciclo, antes y después de ejecutarlo. En el ejemplo anterior, el invariante del ciclo es C_n = n·A (o equivalentemente C = D·A).
Ejemplo: subrutina que calcula N^M Pág. 113-117
Seudocódigo:
Subroutine (N, M; R) ; R ← 1 ; While (M > 0) ; R ← R × N ; M ← M – 1 ; Return
N y M son enteros no negativos y la rutina regresa el valor de R. Sean R_n y M_n los valores de R y M tras pasar n veces por el ciclo:
R_0 = 1,R_1 = N,R_2 = N², … →R_n = N^n.M_0 = M,M_1 = M − 1,M_2 = M − 2, … →M_n = M − n.- De
M_n = M − nse tienen = M − M_n, y sustituyendo:R_n = N^{M − M_n}, es decirR_n · N^{M_n} = N^M. Este es el invariante del ciclo. - Sea
P(n)el enunciadoR_n = N^{M − M_n}; se prueba por inducción conk = 0.
- Paso base (n = 0):
R_0 = 1yN^{M − M_0} = N^{M − M} = N^0 = 1. Cierto. - Hipótesis de inducción:
R_n = N^{M − M_n}. - Paso inductivo (n + 1): tras una iteración más, a
Rse le multiplica porNy aMse le resta 1:R_{n+1} = R_n × N = N^{M − M_n} × N…; comoM_{n+1} = M_n − 1, se obtieneR_{n+1} = N^{M − M_{n+1}}. AsíP(n + 1)es verdadera.
Cuando el ciclo termina, M_n = 0, y entonces R = N^{M − 0} = N^M. Por lo tanto la subrutina calcula N a la M (potencia N^M).
2 Puntos destacados / Lo que hay que saber
{P ∧ B} C1 {Q} y {P ∧ ¬B} C2 {Q} implican {P} if B then C1 else C2 {Q} Pág. 101-107.{ } if a > b then m := a else m := b { (m ≥ a) ∧ (m ≥ b) } es correcta; m obtiene el mayor de a y b Pág. 101-104.P(k) + paso inductivo P(n) ⇒ P(n + 1) implican P(n) para todo n ≥ k Pág. 108.C = D·A (o C_n = n·A); al terminar C = A² Pág. 109-112.R_n · N^{M_n} = N^M (equiv. R_n = N^{M − M_n}); al terminar devuelve N^M Pág. 113-117.3 Actividades y tareas pendientes
En esta clase (Nota 6) no se dejó una tarea nueva: la conferencia desarrolla la regla del if con else y la verificación de ciclos con inducción.
Queda pendiente de entregar la tarea de la Nota 4:
4 Dudas que podrían examinar
¿Cómo demuestro un if con else?
Demostrando { P ∧ B } C1 { Q } para la rama verdadera y { P ∧ ¬B } C2 { Q } para la falsa; ambas implican la terna del if completo. Pág. 99-100
¿Qué hace el ejemplo del máximo?
Con if a > b then m := a else m := b, m queda con el mayor de a y b, y la terna { } … { (m ≥ a) ∧ (m ≥ b) } es correcta. Pág. 101-104
¿En qué consiste la inducción matemática?
En demostrar el paso base P(k) y el paso inductivo P(n) ⇒ P(n + 1); con eso P(n) vale para todo n ≥ k. Pág. 108
¿Qué es el invariante de un ciclo?
Una relación entre variables que se mantiene a través de todas las iteraciones, antes y después de ejecutar el ciclo. Pág. 113
¿Cuál es el invariante de Cuadrado(A)?
C = D·A (o C_n = n·A); al terminar, cuando D = A, C = A². Pág. 109-112
¿Cuál es el invariante de la subrutina de potencia?
R · N^M se conserva en cada iteración (equiv. R_n = N^{M − M_n}); al terminar, cuando M = 0, R = N^M. Pág. 113-117
5 Sitios o recursos para visitar
En esta clase no se mencionaron sitios ni recursos específicos.
Para profundizar en el tema de la clase: regla del if, verificación de ciclos y la lógica de Hoare. · google.com
Concepto de precondición, código y poscondición. · Wikipedia
6 Glosario de términos
- Regla del if con else: si {P ∧ B} C1 {Q} y {P ∧ ¬B} C2 {Q} son correctas, entonces {P} if B then C1 else C2 {Q} es correcto.
- Regla de la asignación: al calcular precondiciones se sustituye en la poscondición el valor que toma la variable tras la asignación.
- Inducción matemática: paso base P(k) + paso inductivo P(n) ⇒ P(n + 1) ⇒ P(n) para todo n ≥ k.
- Paso base (de la inducción): demostrar que P(k) es verdadera para el valor inicial k.
- Paso inductivo: demostrar que, si P(n) es verdadera (hipótesis de inducción), entonces P(n + 1) lo es.
- Hipótesis de inducción: suponer que P(n) es verdadera para una n dada, para probar el paso inductivo.
- Invariante de un ciclo: relación entre variables que persiste a través de todas las iteraciones, antes y después del ciclo.
- Verificación de ciclos: demostración (por inducción) de que un ciclo cumple su invariante y produce el resultado esperado al terminar.
- Traza del ciclo: valores que toman las variables en cada iteración (C₀, C₁, …, R₀, R₁, …, M₀, M₁, …).
7 Mapa mental textual
- Programación Avanzada · Clase 6 · Verificación de programas (Nota 6)
- Regla del if con else
- {P ∧ B} C1 {Q} y {P ∧ ¬B} C2 {Q} ⇒ {P} if B then C1 else C2 {Q}
- Ej.: máximo de dos números (m obtiene el mayor de a y b)
- Ej.: {a>b} if a>b then m:=a else m:=b {m=a}
- Verificación de ciclos · Inducción matemática
- Paso base P(k) + paso inductivo P(n) ⇒ P(n+1) ⇒ P(n) ∀ n ≥ k
- Función Cuadrado(A) (cuadrado de A)
- Traza: C₀=0, C₁=A, C₂=2A, …; D₀=0, D₁=1, …
- Conjetura: C_n = n·A
- Invariante del ciclo: C = D·A
- Al terminar (D=A): C = A²
- Invariante de un ciclo
- Relación que persiste en todas las iteraciones
- Subrutina de potencia (N^M)
- Ciclo: R ← R×N; M ← M−1
- Traza: R₀=1, R₁=N, R₂=N², …; M₀=M, M₁=M−1, …
- Invariante: R_n · N^{M_n} = N^M (equiv. R_n = N^{M − M_n})
- Al terminar (M=0): R = N^M
- Regla del if con else